package com.quectel.util.aspect.lock.annotation;


import java.lang.annotation.*;

/**
 * 分布式可重入锁
 *
 * @author: caolu
 * @email: louis.cao@quectel.com
 * @date: 2022-07-30 16:28:00
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {

    /**
     * 可以对一个方法加入多个锁 WORK_ORDER_LOG+"#{#dto.workOrderId}"
     * <p>
     * 表达式形式如 #{#id} #{#user.id} #{}
     * 如果与extraLockKeysClass同时存在则优先使用lockExpresses中的表达式
     *
     * @return
     */
    String[] lockExpresses() default {};


    /**
     * 当lockExpresses无法计算或者很难获取的时候 需要用实现类动态查询
     * 如果与lockExpresses同时存在则优先使用lockExpresses中的表达式 （不推荐使用）
     *
     * @return
     */
    Class<? extends LockKeysExtractor> extraLockKeysClass() default LockKeysExtractor.class;


    /**
     * 锁的提取器，类实现后计算key
     */
    interface LockKeysExtractor {

        /**
         * 根据方法入参计算锁的表达式<br>
         *
         * @param args @ServiceLock所修饰方法的入参
         * @return
         */
        String[] extraLockKeys(Object... args);
    }


}
